CSRF (Cross-Site Request Forgery) কি?
CSRF (Cross-Site Request Forgery) একটি ওয়েব নিরাপত্তা আক্রমণ, যেখানে একটি ব্যবহারকারী না জেনেই নিজের ব্রাউজার থেকে অনিচ্ছাকৃতভাবে হ্যাকারদের উদ্দেশ্যে অনুরোধ পাঠায়। উদাহরণস্বরূপ, একটি ম্যালিসিয়াস লিঙ্কে ক্লিক করলে ব্যবহারকারীর লগইন সেশনের অধীনে ক্ষতিকর কাজ করা সম্ভব।
Spring Security-তে CSRF Protection ডিফল্টভাবে সক্রিয় থাকে, যা এই ধরনের আক্রমণ প্রতিরোধে সাহায্য করে।
CSRF Protection-এর মূল বৈশিষ্ট্য
- CSRF Protection সক্রিয় থাকলে, প্রতিটি HTTP POST, PUT, DELETE ইত্যাদি অনুরোধের সঙ্গে একটি CSRF টোকেন সরবরাহ করতে হবে।
- Spring Security একটি CSRF টোকেন জেনারেট করে এবং তা ক্লায়েন্ট সাইডে কুকি বা Hidden Form Field-এ সংরক্ষণ করে।
- CSRF টোকেন যাচাই করার মাধ্যমে অননুমোদিত অনুরোধ প্রতিরোধ করা যায়।
Spring Security-তে CSRF Protection বাস্তবায়ন
1. Spring Security Dependency
Spring Boot প্রকল্পে spring-boot-starter-security ডিপেন্ডেন্সি যোগ করুন।
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
2. CSRF Protection কনফিগারেশন
Spring Security-এর CSRF Protection ডিফল্টভাবে সক্রিয় থাকে। তবে, আপনি কনফিগারেশন কাস্টমাইজ করতে পারেন।
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/public/**").permitAll() // পাবলিক এন্ডপয়েন্ট সবার জন্য উন্মুক্ত
.anyRequest().authenticated() // অন্য সব এন্ডপয়েন্টে প্রমাণীকরণ প্রয়োজন
.and()
.csrf() // CSRF Protection সক্রিয়
.and()
.formLogin(); // ফর্ম ভিত্তিক লগইন সক্রিয়
return http.build();
}
}
3. CSRF Token সংগ্রহ ও পাঠানো
HTML ফর্মের ক্ষেত্রে:
Spring Security thymeleaf বা অন্য টেমপ্লেট ইঞ্জিন ব্যবহার করলে, Hidden Field এর মাধ্যমে CSRF টোকেন পাঠানো যায়।
<form action="/submit" method="post">
<input type="hidden" name="_csrf" value="${_csrf.token}" />
<button type="submit">Submit</button>
</form>
AJAX অনুরোধের ক্ষেত্রে:
AJAX অনুরোধ পাঠানোর সময় CSRF টোকেন হেডারে যোগ করতে হবে।
// CSRF টোকেন সংগ্রহ
const csrfToken = document.querySelector('meta[name="_csrf"]').content;
// AJAX অনুরোধ
fetch('/submit', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-CSRF-TOKEN': csrfToken // CSRF টোকেন হেডারে যোগ
},
body: JSON.stringify({ name: "John Doe" })
}).then(response => {
console.log(response);
});
4. CSRF Token-সহ একটি উদাহরণ
Controller:
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
@RestController
@RequestMapping("/")
public class AppController {
@GetMapping("/form")
public ModelAndView showForm() {
return new ModelAndView("form"); // form.html ফাইলটি রিটার্ন করবে
}
@PostMapping("/submit")
public String handleSubmit(@RequestParam String name) {
return "Submitted Name: " + name;
}
}
HTML ফর্ম (form.html):
<!DOCTYPE html>
<html>
<head>
<meta name="_csrf" content="${_csrf.token}">
</head>
<body>
<h1>Submit Your Name</h1>
<form action="/submit" method="post">
<input type="text" name="name" placeholder="Enter your name">
<input type="hidden" name="_csrf" value="${_csrf.token}">
<button type="submit">Submit</button>
</form>
</body>
</html>
CSRF Protection নিষ্ক্রিয় করার পদ্ধতি (শিক্ষামূলক উদ্দেশ্যে)
যদি আপনার কোনো বিশেষ ক্ষেত্রে CSRF Protection নিষ্ক্রিয় করতে হয় (যেমন API এর ক্ষেত্রে যেখানে JWT ব্যবহার করা হয়), নিচের পদ্ধতি অনুসরণ করুন:
http
.csrf().disable() // CSRF Protection নিষ্ক্রিয়
.authorizeRequests()
.anyRequest().authenticated();
নোট: CSRF Protection নিষ্ক্রিয় করা হলে, সিস্টেম নিরাপত্তার ঝুঁকিতে পড়তে পারে। শুধুমাত্র প্রয়োজনীয় ক্ষেত্রেই এটি নিষ্ক্রিয় করুন।
CSRF Protection-এর সেরা চর্চা
- CSRF Protection সক্রিয় রাখুন:
- Spring Security-তে CSRF Protection ডিফল্টভাবে সক্রিয় থাকে। এটিকে অকারণে নিষ্ক্রিয় করবেন না।
- API-এর ক্ষেত্রে বিকল্প Authentication পদ্ধতি ব্যবহার করুন:
- JWT (JSON Web Token) বা OAuth2 ব্যবহার করলে CSRF টোকেনের প্রয়োজন নেই।
- Secure Cookies:
- CSRF টোকেন কুকিতে সংরক্ষণ করলে, এটি
SecureএবংHttpOnlyপ্রোপার্টি সহ ব্যবহার করুন।
- CSRF টোকেন কুকিতে সংরক্ষণ করলে, এটি
- CORS (Cross-Origin Resource Sharing):
- নির্দিষ্ট ডোমেইন থেকে অনুরোধ গ্রহণ করতে CORS কনফিগার করুন।
উপসংহার
Spring Security-র CSRF Protection Cross-Site Request Forgery আক্রমণ প্রতিরোধে অত্যন্ত কার্যকর। ডিফল্টভাবে এটি সক্রিয় থাকে এবং এর ব্যবহার সহজ। উদাহরণগুলো অনুসরণ করে ফর্ম বা AJAX অনুরোধের সাথে CSRF টোকেন সংযুক্ত করে নিরাপত্তা নিশ্চিত করা যায়।
Read more